<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="QexF8" id="QexF8"><span data-lake-id="u9d56cb79" id="u9d56cb79">典型回答</span></h1>
  <p data-lake-id="u4ade3a9e" id="u4ade3a9e"><br></p>
  <p data-lake-id="u838dbf23" id="u838dbf23"><span data-lake-id="ubf66ddcf" id="ubf66ddcf">线程数设定是个高频出现的题目，这个题目对于优秀的面试官希望得到的答案是面试者的思考过程，考察其分析线程数设定的思考方向是否全面(主要包括对操作系统线程的理解和实际设置经验)。比较差的面试官才会认为固定的公式是正确的。</span></p>
  <p data-lake-id="u9da2e065" id="u9da2e065"><span data-lake-id="u043d4604" id="u043d4604">​</span><br></p>
  <p data-lake-id="u55b861c5" id="u55b861c5"><span data-lake-id="u5b54116b" id="u5b54116b">所谓的公式，一般情况下，需要根据你的任务情况来设置线程数，任务可能是两种类型，分别是CPU密集型和IO密集型。</span></p>
  <p data-lake-id="ucfdb9ad4" id="ucfdb9ad4"><span data-lake-id="ucc94c03c" id="ucc94c03c">​</span><br></p>
  <ul list="uc4415676">
   <li fid="u209b7fcc" data-lake-id="u22911664" id="u22911664"><span data-lake-id="uf9bc8414" id="uf9bc8414">如果是CPU密集型应用，则</span><span data-lake-id="udb0853f0" id="udb0853f0">线程池</span><span data-lake-id="u24c0371a" id="u24c0371a">大小设置为N+1 </span></li>
   <li fid="u209b7fcc" data-lake-id="u15ef5005" id="u15ef5005"><span data-lake-id="u5867bc2b" id="u5867bc2b">如果是IO密集型应用，则线程池大小设置为2N+1 </span></li>
  </ul>
  <p data-lake-id="u732f5f7b" id="u732f5f7b"><span data-lake-id="u79571e19" id="u79571e19"><br></span><span data-lake-id="u18ac9b00" id="u18ac9b00"> 上面的N为CPU总核数，但是实际应用起来，也不要死守着公式不放，公式只是可以当作参考。</span></p>
  <p data-lake-id="u3b073bae" id="u3b073bae"><span data-lake-id="u4ff6b49e" id="u4ff6b49e">​</span><br></p>
  <p data-lake-id="ucb0ee90f" id="ucb0ee90f"><span data-lake-id="ubad7e840" id="ubad7e840">很多时候，我们的应用部署在云服务器上面，有时候给我们分配的机器显示的是8核的，但是你要知道你实际上使用的只是虚拟机而已，并不是物理机，实际上大多数情况下不能发挥出8核的作用来。</span></p>
  <p data-lake-id="uacbf5ebf" id="uacbf5ebf"><span data-lake-id="u86e173a2" id="u86e173a2">​</span><br></p>
  <p data-lake-id="uc24ade03" id="uc24ade03"><span data-lake-id="u30c580b8" id="u30c580b8">而且，上面的公式中，前提要求是知道你的应用是IO密集型还是CPU密集型，那么，到底怎么样算IO密集，怎么样又算CPU密集呢？一个应用就真的能明确的定位出来是CPU密集还是IO密集吗？、</span></p>
  <p data-lake-id="u58b738a2" id="u58b738a2"><span data-lake-id="uf74804a1" id="uf74804a1">​</span><br></p>
  <p data-lake-id="uc689fbbc" id="uc689fbbc"><span data-lake-id="udb89a4ae" id="udb89a4ae">还有，现在很多CPU都采用了超线程技术，也就是利用特殊的硬件指令，把两个逻辑内核模拟成两个物理芯片，让单个处理器都能使用线程级并行计算。所以我们经常可以看到"4核8线程的CPU"，也就是物理内核有4个，逻辑内核有8个，但是按照4和8配置都不合理，因为超线程技术整体性能提升也并不是100%的。</span></p>
  <p data-lake-id="u5be8f592" id="u5be8f592"><span data-lake-id="uf1cb9504" id="uf1cb9504">​</span><br></p>
  <p data-lake-id="u291e70c8" id="u291e70c8"><span data-lake-id="uf1f43593" id="uf1f43593">​</span><br></p>
  <p data-lake-id="ua9f160dc" id="ua9f160dc"><span data-lake-id="u86b34269" id="u86b34269">所以回答的时候，最好是询问面试官什么业务场景，什么机器配置，多大的并发量，一次业务处理整体耗时是多少。</span></p>
  <p data-lake-id="ue1e4555b" id="ue1e4555b"><span data-lake-id="u81b112b2" id="u81b112b2">​</span><br></p>
  <p data-lake-id="u5164f0db" id="u5164f0db"><span data-lake-id="uf8da98ff" id="uf8da98ff">然后再说</span><strong><span data-lake-id="ue1d0ba1a" id="ue1d0ba1a">可以在刚上线的时候，先根据公式大致的设置一个数值，然后再根据你自己的实际业务情况，以及不断的压测结果，再不断调整，最终达到一个相对合理的值。</span></strong></p>
  <p data-lake-id="uaa71c3fc" id="uaa71c3fc"><span data-lake-id="uf30d9c4a" id="uf30d9c4a">​</span><br></p>
  <p data-lake-id="u60454867" id="u60454867"><span data-lake-id="u64aed137" id="u64aed137">在说明压测的时候，要说清楚可接受的响应耗时是多少，大于这个阈值即是错误，错误率多少可接受。这样给出的线程池参数才合理。</span></p>
  <p data-lake-id="u0e4b7baf" id="u0e4b7baf"><span data-lake-id="u0140049c" id="u0140049c">​</span><br></p>
 </body>
</html>